From bceebe6cb7c30873d0f4158d1add16bc89f9ec5b Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 30 Jan 2009 15:45:34 +0000 Subject: [PATCH] (detect_eol, decode_eol): Handle text with DOS-style EOLs that also has stray ^M characters. --- src/coding.c | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/coding.c b/src/coding.c index 8c7ddf34db2..38cb3605464 100644 --- a/src/coding.c +++ b/src/coding.c @@ -5819,16 +5819,26 @@ detect_eol (source, src_bytes, category) || src[lsb + 2] != '\n') this_eol = EOL_SEEN_CR; else - this_eol = EOL_SEEN_CRLF; + { + this_eol = EOL_SEEN_CRLF; + src += 2; + } if (eol_seen == EOL_SEEN_NONE) /* This is the first end-of-line. */ eol_seen = this_eol; else if (eol_seen != this_eol) { - /* The found type is different from what found before. */ - eol_seen = EOL_SEEN_LF; - break; + /* The found type is different from what found before. + Allow for stray ^M characters in DOS EOL files. */ + if (eol_seen == EOL_SEEN_CR && this_eol == EOL_SEEN_CRLF + || eol_seen == EOL_SEEN_CRLF && this_eol == EOL_SEEN_CR) + eol_seen = EOL_SEEN_CRLF; + else + { + eol_seen = EOL_SEEN_LF; + break; + } } if (++total == MAX_EOL_CHECK_COUNT) break; @@ -5857,9 +5867,16 @@ detect_eol (source, src_bytes, category) eol_seen = this_eol; else if (eol_seen != this_eol) { - /* The found type is different from what found before. */ - eol_seen = EOL_SEEN_LF; - break; + /* The found type is different from what found before. + Allow for stray ^M characters in DOS EOL files. */ + if (eol_seen == EOL_SEEN_CR && this_eol == EOL_SEEN_CRLF + || eol_seen == EOL_SEEN_CRLF && this_eol == EOL_SEEN_CR) + eol_seen = EOL_SEEN_CRLF; + else + { + eol_seen = EOL_SEEN_LF; + break; + } } if (++total == MAX_EOL_CHECK_COUNT) break; @@ -6114,7 +6131,12 @@ decode_eol (coding) eol_seen |= EOL_SEEN_CR; } } - if (eol_seen != EOL_SEEN_NONE + /* Handle DOS-style EOLs in a file with stray ^M characters. */ + if ((eol_seen & EOL_SEEN_CRLF) != 0 + && (eol_seen & EOL_SEEN_CR) != 0 + && (eol_seen & EOL_SEEN_LF) == 0) + eol_seen = EOL_SEEN_CRLF; + else if (eol_seen != EOL_SEEN_NONE && eol_seen != EOL_SEEN_LF && eol_seen != EOL_SEEN_CRLF && eol_seen != EOL_SEEN_CR) -- 2.30.2